package 常见算法.双指针;

/**
 * @Date 2024/6/25 20:00
 * @description: 快乐数： 思想就是判断是否有环
 * .
 * @Author LittleNight
 */
public class likou202 {

    // 和链表中判断有环一样，都用到了快慢双指针，满指针走一步，快指针走两步
    public boolean isHappy(int n) {
        // 双指针是一种思想,并不是要创建一个C语言中 node* 的东西
        // 这道题就可以让这个数来充当这个指针
        int slow = n, fast = bitSum(n); // 快指针先走一步
        while(slow != fast) {
            // 慢指针走一步,快指针走两步, 一定是可以相遇的，原理：鸽巢原理（抽屉原理）
            // 判断在链表中有环的那道题,也是快慢指针相遇,也是慢指针走一步,快指针走两步,判断是否相遇,这道题不用判断相遇,而是判断相遇的值是什么,因为这道题题干是一定相遇的
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }
        return slow == 1;
    }

    // 计算各个位数的平方和
    public int bitSum(int n) {
        int sum = 0;
        while(n != 0) {
            // 求出最后一位数
            int t = n % 10; // 求余数
            sum += t * t;
            // 求除以10之后的数
            n /= 10; // 求商
        }
        return sum;
    }
}
